package com.kingzoder.food.common.utils;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @author 轩辕铮
 * 日期工具类
 */
public class TimeUtils {
    // 默认时区
    private static final ZoneId DEFAULT_ZONE = ZoneId.systemDefault();
    // 默认日期时间格式
    private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 获取当前时间戳（毫秒）
     *
     * @return 毫秒级时间戳
     */
    public static long currentTimestamp() {
        return Instant.now().toEpochMilli();
    }

    /**
     * 获取当前时间戳（秒）
     *
     * @return 秒级时间戳
     */
    public static long currentTimestampSeconds() {
        return Instant.now().getEpochSecond();
    }

    /**
     * 毫秒时间戳转 LocalDateTime
     *
     * @param timestamp 毫秒时间戳
     * @return LocalDateTime
     */
    public static LocalDateTime timestampToLocalDateTime(long timestamp) {
        return Instant.ofEpochMilli(timestamp).atZone(DEFAULT_ZONE).toLocalDateTime();
    }

    /**
     * 秒时间戳转 LocalDateTime
     *
     * @param timestamp 秒时间戳
     * @return LocalDateTime
     */
    public static LocalDateTime timestampSecondsToLocalDateTime(long timestamp) {
        return Instant.ofEpochSecond(timestamp).atZone(DEFAULT_ZONE).toLocalDateTime();
    }

    /**
     * LocalDateTime 转毫秒时间戳
     *
     * @param localDateTime LocalDateTime
     * @return 毫秒时间戳
     */
    public static long localDateTimeToTimestamp(LocalDateTime localDateTime) {
        return localDateTime.atZone(DEFAULT_ZONE).toInstant().toEpochMilli();
    }

    /**
     * LocalDateTime 转秒时间戳
     *
     * @param localDateTime LocalDateTime
     * @return 秒时间戳
     */
    public static long localDateTimeToTimestampSeconds(LocalDateTime localDateTime) {
        return localDateTime.atZone(DEFAULT_ZONE).toInstant().getEpochSecond();
    }

    /**
     * 毫秒时间戳转日期字符串
     *
     * @param timestamp 毫秒时间戳
     * @return 日期字符串（格式：yyyy-MM-dd HH:mm:ss）
     */
    public static String timestampToString(long timestamp) {
        return timestampToLocalDateTime(timestamp).format(DEFAULT_FORMATTER);
    }

    /**
     * 秒时间戳转日期字符串
     *
     * @param timestamp 秒时间戳
     * @return 日期字符串（格式：yyyy-MM-dd HH:mm:ss）
     */
    public static String timestampSecondsToString(long timestamp) {
        return timestampSecondsToLocalDateTime(timestamp).format(DEFAULT_FORMATTER);
    }

    /**
     * 日期字符串转毫秒时间戳
     *
     * @param dateStr 日期字符串（格式：yyyy-MM-dd HH:mm:ss）
     * @return 毫秒时间戳
     */
    public static long stringToTimestamp(String dateStr) {
        LocalDateTime localDateTime = LocalDateTime.parse(dateStr, DEFAULT_FORMATTER);
        return localDateTimeToTimestamp(localDateTime);
    }

    /**
     * 日期字符串转秒时间戳
     *
     * @param dateStr 日期字符串（格式：yyyy-MM-dd HH:mm:ss）
     * @return 秒时间戳
     */
    public static long stringToTimestampSeconds(String dateStr) {
        LocalDateTime localDateTime = LocalDateTime.parse(dateStr, DEFAULT_FORMATTER);
        return localDateTimeToTimestampSeconds(localDateTime);
    }

    /**
     * 毫秒时间戳转 Date
     *
     * @param timestamp 毫秒时间戳
     * @return Date
     */
    public static Date timestampToDate(long timestamp) {
        return new Date(timestamp);
    }

    /**
     * Date 转毫秒时间戳
     *
     * @param date Date
     * @return 毫秒时间戳
     */
    public static long dateToTimestamp(Date date) {
        return date.getTime();
    }

    /**
     * LocalDateTime 转 Date
     *
     * @param localDateTime LocalDateTime
     * @return Date
     */
    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
        ZonedDateTime zonedDateTime = localDateTime.atZone(DEFAULT_ZONE);
        return Date.from(zonedDateTime.toInstant());
    }

    /**
     * Date 转 LocalDateTime
     *
     * @param date Date
     * @return LocalDateTime
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        return Instant.ofEpochMilli(date.getTime()).atZone(DEFAULT_ZONE).toLocalDateTime();
    }

    /**
     * 获取当天日期（格式：yyyy-MM-dd）
     *
     * @return 当天日期字符串
     */
    public static String getToday() {
        return LocalDate.now().toString();
    }

    /**
     * 获取当前日期时间（格式：yyyy-MM-dd HH:mm:ss）
     *
     * @return 当前日期时间字符串
     */
    public static String getNow() {
        return LocalDateTime.now().format(DEFAULT_FORMATTER);
    }

    public static void main(String[] args) {
        // 测试示例
        long currentMillis = currentTimestamp();
        long currentSeconds = currentTimestampSeconds();

        System.out.println("当前毫秒时间戳: " + currentMillis);
        System.out.println("当前秒时间戳: " + currentSeconds);
        System.out.println("毫秒时间戳转日期: " + timestampToString(currentMillis));
        System.out.println("秒时间戳转日期: " + timestampSecondsToString(currentSeconds));

        String dateStr = "2023-01-01 12:00:00";
        System.out.println("日期字符串转毫秒时间戳: " + stringToTimestamp(dateStr));
        System.out.println("日期字符串转秒时间戳: " + stringToTimestampSeconds(dateStr));

        LocalDateTime localDateTime = timestampToLocalDateTime(currentMillis);
        System.out.println("LocalDateTime: " + localDateTime);

        Date date = timestampToDate(currentMillis);
        System.out.println("Date: " + date);
    }
}
